home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / allsort.zip / ALLSORT.PAS < prev   
Pascal/Delphi Source File  |  1992-03-08  |  10KB  |  419 lines

  1.  
  2. (*   ALLSORT.PAS: Demonstration of various sorting methods.
  3.                   Released to the public domain by Wayel A. Al-Wohaibi.
  4.  
  5.      ALLSORT.PAS was written in Turbo Pascal 3.0 (but compatible with
  6.      TP6.0) while taking a pascal course in 1988. It is provided as is,
  7.      to demonstrate how sorting algorithms work. Sorry, no documentation
  8.      (didn't imagine it would be worth releasing) but bugs are included
  9.      too!
  10.  
  11.      ALLSORT simply shows you how elements are rearranged in each
  12.      iteration of each of the eight popular sorting methods.               *)
  13.  
  14. program SORTINGMETHODS;
  15. uses
  16.   Crt;
  17.  
  18. const
  19.   N = 14;                              (* NO. OF DATA TO BE SORTED *)
  20.   Digits = 3;                          (* DIGITAL SIZE OF THE DATA *)
  21.   Range = 1000;                        (* RANGE FOR THE RANDOM GENERATOR *)
  22.  
  23. type
  24.   ArrayType = array[1..N] of integer;
  25.   TwoDimension = array[0..9, 1..N] of integer; (* FOR RADIX SORT ONLY *)
  26.  
  27. var
  28.   Data : ArrayType;
  29.   D : integer;
  30.  
  31.   (*--------------------------------------------------------------------*)
  32.  
  33.   procedure GetSortMethod;
  34.   begin
  35.     clrscr;
  36.     writeln;
  37.     writeln('                          CHOOSE:          ');
  38.     writeln('                                           ');
  39.     writeln('                      1 FOR SELECT SORT    ');
  40.     writeln('                      2 FOR INSERT SORT    ');
  41.     writeln('                      3 FOR BUBBLE SORT    ');
  42.     writeln('                      4 FOR SHAKE  SORT    ');
  43.     writeln('                      5 FOR HEAP   SORT    ');
  44.     writeln('                      6 FOR QUICK  SORT    ');
  45.     writeln('                      7 FOR SHELL  SORT    ');
  46.     writeln('                      8 FOR RADIX  SORT    ');
  47.     writeln('                      9 TO EXIT ALLSORT    ');
  48.     writeln('                                           ');
  49.     writeln;
  50.     readln(D)
  51.   end;
  52.  
  53.   procedure LoadList;
  54.   var
  55.     I : integer;
  56.   begin
  57.     for I := 1 to N do
  58.       Data[I] := random(Range)
  59.   end;
  60.  
  61.   procedure ShowInput;
  62.   var
  63.     I : integer;
  64.   begin
  65.     clrscr;
  66.     write('INPUT :');
  67.     for I := 1 to N do
  68.       write(Data[I]:5);
  69.     writeln
  70.   end;
  71.  
  72.   procedure ShowOutput;
  73.   var
  74.     I : integer;
  75.   begin
  76.     write('OUTPUT:');
  77.     for I := 1 to N do
  78.       write(Data[I]:5)
  79.   end;
  80.  
  81.   procedure Swap(var X, Y : integer);
  82.   var
  83.     Temp : integer;
  84.   begin
  85.     Temp := X;
  86.     X := Y;
  87.     Y := Temp
  88.   end;
  89.  
  90.   (*-------------------------- R A D I X   S O R T ---------------------*)
  91.  
  92.   function Hash(Number, H : integer) : integer;
  93.   begin
  94.     case H of
  95.       3 : Hash := Number mod 10;
  96.       2 : Hash := (Number mod 100) div 10;
  97.       1 : Hash := Number div 100
  98.     end
  99.   end;
  100.  
  101.   procedure CleanArray(var TwoD : TwoDimension);
  102.   var
  103.     I, J : integer;
  104.   begin
  105.     for I := 0 to 9 do
  106.       for J := 1 to N do
  107.         TwoD[I, J] := 0
  108.   end;
  109.  
  110.   procedure PlaceIt(var X : TwoDimension; Number, I : integer);
  111.   var
  112.     J : integer;
  113.     Empty : boolean;
  114.   begin
  115.     J := 1;
  116.     Empty := false;
  117.     repeat
  118.       if (X[I, J] > 0) then
  119.         J := J + 1
  120.       else
  121.         Empty := true;
  122.     until (Empty) or (J = N);
  123.     X[I, J] := Number
  124.   end;
  125.  
  126.   procedure UnLoadIt(X : TwoDimension; var Passed : ArrayType);
  127.   var
  128.     I,
  129.     J,
  130.     K : integer;
  131.   begin
  132.     K := 1;
  133.     for I := 0 to 9 do
  134.       for J := 1 to N do
  135.         begin
  136.           if (X[I, J] > 0) then
  137.             begin
  138.               Passed[K] := X[I, J];
  139.               K := K + 1
  140.             end
  141.         end
  142.   end;
  143.  
  144.   procedure RadixSort(var Pass : ArrayType; N : integer);
  145.   var
  146.     Temp : TwoDimension;
  147.     Element,
  148.     Key,
  149.     Digit,
  150.     I : integer;
  151.   begin
  152.     for Digit := Digits downto 1 do
  153.       begin
  154.         CleanArray(Temp);
  155.         for I := 1 to N do
  156.           begin
  157.             Element := Pass[I];
  158.             Key := Hash(Element, Digit);
  159.             PlaceIt(Temp, Element, Key)
  160.           end;
  161.         UnLoadIt(Temp, Pass);
  162.         ShowOutput;
  163.         readln
  164.       end
  165.   end;
  166.  
  167.   (*-------------------------- H E A P   S O R T -----------------------*)
  168.  
  169.   procedure ReHeapDown(var HEAPData : ArrayType; Root, Bottom : integer);
  170.   var
  171.     HeapOk : boolean;
  172.     MaxChild : integer;
  173.   begin
  174.     HeapOk := false;
  175.     while (Root * 2 <= Bottom)
  176.     and not HeapOk do
  177.       begin
  178.         if (Root * 2 = Bottom) then
  179.           MaxChild := Root * 2
  180.         else
  181.           if (HEAPData[Root * 2] > HEAPData[Root * 2 + 1]) then
  182.             MaxChild := Root * 2
  183.           else
  184.             MaxChild := Root * 2 + 1;
  185.         if (HEAPData[Root] < HEAPData[MaxChild]) then
  186.           begin
  187.             Swap(HEAPData[Root], HEAPData[MaxChild]);
  188.             Root := MaxChild
  189.           end
  190.         else
  191.           HeapOk := true
  192.       end
  193.   end;
  194.  
  195.   procedure HeapSort(var Data : ArrayType; NUMElementS : integer);
  196.   var
  197.     NodeIndex : integer;
  198.   begin
  199.     for NodeIndex := (NUMElementS div 2) downto 1 do
  200.       ReHeapDown(Data, NodeIndex, NUMElementS);
  201.     for NodeIndex := NUMElementS downto 2 do
  202.       begin
  203.         Swap(Data[1], Data[NodeIndex]);
  204.         ReHeapDown(Data, 1, NodeIndex - 1);
  205.         ShowOutput;
  206.         readln;
  207.       end
  208.   end;
  209.  
  210.   (*-------------------------- I N S E R T   S O R T -------------------*)
  211.  
  212.   procedure StrInsert(var X : ArrayType; N : integer);
  213.   var
  214.     J,
  215.     K,
  216.     Y : integer;
  217.     Found : boolean;
  218.   begin
  219.     for J := 2 to N do
  220.       begin
  221.         Y := X[J];
  222.         K := J - 1;
  223.         Found := false;
  224.         while (K >= 1)
  225.         and (not Found) do
  226.           if (Y < X[K]) then
  227.             begin
  228.               X[K + 1] := X[K];
  229.               K := K - 1
  230.             end
  231.           else
  232.             Found := true;
  233.         X[K + 1] := Y;
  234.         ShowOutput;
  235.         readln
  236.       end
  237.    end;
  238.  
  239.   (*-------------------------- S H E L L   S O R T ---------------------*)
  240.  
  241.   procedure ShellSort(var A : ArrayType; N : integer);
  242.   var
  243.     Done : boolean;
  244.     Jump,
  245.     I,
  246.     J : integer;
  247.   begin
  248.     Jump := N;
  249.     while (Jump > 1) do
  250.       begin
  251.         Jump := Jump div 2;
  252.         repeat
  253.           Done := true;
  254.           for J := 1 to (N - Jump) do
  255.             begin
  256.               I := J + Jump;
  257.               if (A[J] > A[I]) then
  258.                 begin
  259.                   Swap(A[J], A[I]);
  260.                   Done := false
  261.                 end;
  262.             end;
  263.         until Done;
  264.         ShowOutput;
  265.         readln
  266.       end
  267.   end;
  268.  
  269.   (*-------------------------- B U B B L E   S O R T -------------------*)
  270.  
  271.   procedure BubbleSort(var X : ArrayType; N : integer);
  272.   var
  273.     I,
  274.     J : integer;
  275.   begin
  276.     for I := 2 to N do
  277.       begin
  278.         for J := N downto I do
  279.           if (X[J] < X[J - 1]) then
  280.             Swap(X[J - 1], X[J]);
  281.         ShowOutput;
  282.         readln
  283.       end
  284.   end;
  285.  
  286.   (*-------------------------- S H A K E   S O R T ---------------------*)
  287.  
  288.   procedure ShakeSort(var X : ArrayType; N : integer);
  289.   var
  290.     L,
  291.     R,
  292.     K,
  293.     J : integer;
  294.   begin
  295.     L := 2;
  296.     R := N;
  297.     K := N;
  298.     repeat
  299.       for J := R downto L do
  300.         if (X[J] < X[J - 1]) then
  301.           begin
  302.             Swap(X[J], X[J - 1]);
  303.             K := J
  304.           end;
  305.       L := K + 1;
  306.       for J := L to R do
  307.         if (X[J] < X[J - 1]) then
  308.           begin
  309.             Swap(X[J], X[J - 1]);
  310.             K := J
  311.           end;
  312.       R := K - 1;
  313.       ShowOutput;
  314.       readln;
  315.     until L >= R
  316.   end;
  317.  
  318.   (*-------------------------- Q W I C K   S O R T ---------------------*)
  319.  
  320.   procedure Partition(var A : ArrayType; First, Last : integer);
  321.   var
  322.     Right,
  323.     Left : integer;
  324.     V : integer;
  325.   begin
  326.     V := A[(First + Last) div 2];
  327.     Right := First;
  328.     Left := Last;
  329.     repeat
  330.       while (A[Right] < V) do
  331.         Right := Right + 1;
  332.       while (A[Left] > V) do
  333.         Left := Left - 1;
  334.       if (Right <= Left) then
  335.         begin
  336.           Swap(A[Right], A[Left]);
  337.           Right := Right + 1;
  338.           Left := Left - 1
  339.         end;
  340.     until Right > Left;
  341.     ShowOutput;
  342.     readln;
  343.     if (First < Left) then
  344.       Partition(A, First, Left);
  345.     if (Right < Last) then
  346.       Partition(A, Right, Last)
  347.   end;
  348.  
  349.   procedure QuickSort(var List : ArrayType; N : integer);
  350.   var
  351.     First,
  352.     Last : integer;
  353.   begin
  354.     First := 1;
  355.     Last := N;
  356.     if (First < Last) then
  357.       Partition(List, First, Last)
  358.   end;
  359.  
  360.   (*-------------------------- S E L E C T   S O R T -------------------*)
  361.  
  362.   procedure StrSelectSort(var X : ArrayType; N : integer);
  363.   var
  364.     I,
  365.     J,
  366.     K,
  367.     Y : integer;
  368.   begin
  369.     for I := 1 to N - 1 do
  370.       begin
  371.         K := I;
  372.         Y := X[I];
  373.         for J := (I + 1) to N do
  374.           if (X[J] < Y) then
  375.             begin
  376.               K := J;
  377.               Y := X[J]
  378.             end;
  379.         X[K] := X[J];
  380.         X[I] := Y;
  381.         ShowOutput;
  382.         readln
  383.       end
  384.   end;
  385.  
  386.   (*--------------------------------------------------------------------*)
  387.  
  388.   procedure Sort;
  389.   begin
  390.     case D of
  391.       1 : StrSelectSort(Data, N);
  392.       2 : StrInsert(Data, N);
  393.       3 : BubbleSort(Data, N);
  394.       4 : ShakeSort(Data, N);
  395.       5 : HeapSort(Data, N);
  396.       6 : QuickSort(Data, N);
  397.       7 : ShellSort(Data, N);
  398.       8 : RadixSort(Data, N);
  399.     else
  400.      writeln('BAD INPUT')
  401.     end
  402.   end;
  403.  
  404.   (*-------------------------------------------------------------------*)
  405.  
  406. BEGIN
  407.   GetSortMethod;
  408.   while (D <> 9) do
  409.     begin
  410.       LoadList;
  411.       ShowInput;
  412.       Sort;
  413.       writeln('PRESS ENTER TO RETURN');
  414.       readln;
  415.       GetSortMethod
  416.     end
  417. END.
  418.  
  419.